// 实现Base64加密
function base64Encode(str) {
	let base64 = new Base64();
	return base64.encode(str);
}

// 实现Base64解密
function base64Decode(str) {
	let base64 = new Base64();
	return base64.decode(str);
}

// 定义Base64对象
function Base64() {

	// Base64字符集
	const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

	// 编码函数
	this.encode = function(str) {
		let result = '';
		for (let i = 0; i < str.length; i += 3) {
			let a = str.charCodeAt(i);
			let b = i + 1 < str.length ? str.charCodeAt(i + 1) : 0;
			let c = i + 2 < str.length ? str.charCodeAt(i + 2) : 0;

			let a1 = a >> 2,
				a2 = ((a & 3) << 4) | (b >> 4),
				a3 = ((b & 15) << 2) | (c >> 6),
				a4 = c & 63;

			result += base64Chars[a1] + base64Chars[a2] + (i + 1 < str.length ? base64Chars[a3] : '=') + (i + 2 < str
				.length ? base64Chars[a4] : '=');
		}
		return result;
	}

	// 解码函数
	this.decode = function(str) {
		let result = '';
		let i = 0;
		while (i < str.length) {
			let a = base64Chars.indexOf(str.charAt(i++));
			let b = base64Chars.indexOf(str.charAt(i++));
			let c = base64Chars.indexOf(str.charAt(i++));
			let d = base64Chars.indexOf(str.charAt(i++));

			let a1 = (a << 2) | (b >> 4);
			let a2 = ((b & 15) << 4) | (c >> 2);
			let a3 = ((c & 3) << 6) | d;

			result += String.fromCharCode(a1);
			if (c != 64) {
				result += String.fromCharCode(a2);
			}
			if (d != 64) {
				result += String.fromCharCode(a3);
			}
		}
		return result;
	}
}

// 向外暴露方法
module.exports = {
	base64Encode,
	base64Decode
}